#include <iostream>
#include <cstdio>
#include <pthread.h>
#include <string>
#include <unistd.h>
#include <cstdio>
#include <string.h>
#include <vector>













//创建多线程

// const int num = 10;

// void *routine(void *args)
// {
//     std::string name = static_cast<const char*>(args);
//     delete (char*)args;

//     int cnt = 5;
//     while(cnt--)
//     {
//         std::cout << "new线程名字: " << name <<std::endl;
//         sleep(1);
//     }

//     return nullptr;
// }

// int main()
// {
//     std::vector<pthread_t> tids;
//     for(int i = 0;i < num; i++)
//     {
//         pthread_t tid;
//         char *id = new char[64];
//         snprintf(id,sizeof(id),"thread-%d",i);
//         int n = pthread_create(&tid,nullptr,routine, id);
//         if(n == 0)
//             tids.push_back(tid);
//         else
//             continue;
//     }

//     for(int i = 0;i < num; i++)
//     {
//         int n = pthread_join(tids[i],nullptr);
//         if(n == 0)
//         {
//             std::cout << "等待新线程成功" << std::endl;
//         }
//     }

//     return 0;
// }






// int flag = 100;

// void showtid(pthread_t &tid)
// {
//     // printf("tid: %ld\n",tid);//线程id值
//     printf("tid: 0x%lx\n",tid);//线程id值
// }

// std::string FormatId(const pthread_t &tid)
// {
//     char id[64];
//     snprintf(id,sizeof(id),"0x%lx", tid);
//     return id;
// }

// void *routine(void *args)
// {
//     std::string name = static_cast<const char*>(args);
//     pthread_t tid = pthread_self();
//     int cnt = 5;
//     while(cnt)
//     {
//         std::cout << "我是一个新线程，我的名字是：" << name << " 我的Id是: " << FormatId(pthread_self()) << std::endl;
//         sleep(1);
//         cnt--;
//         flag++;
//     }

//     return (void*)100;//暂时：线程退出的时候的退出码
// }

// int main()
// {
//     pthread_t tid;
//     int n = pthread_create(&tid,nullptr,routine,(void*)"thread -l");
//     (void)n;

//     showtid(tid);

//     int cnt = 5;
//     while(cnt)
//     {
//         std::cout << "我是main线程: 我的名字是: main thread" << " 我的Id是: " << FormatId(pthread_self()) << "flag: " << flag << std::endl;
//         sleep(1);
//         cnt--;
//     }

//     void * ret = nullptr;
//     pthread_join(tid,&ret);//等待线程,并且可以获取线程退出的时候的退出码

//     std::cout<< "ret is : " << (long long int)ret << std::endl;
// }


// void *routine(void *args)
// {
//     std::string name = static_cast<const char *>(args);
//     int cnt = 10;
//     while (cnt)
//     {
//         std::cout << "线程名字: " << name << std::endl;
//         sleep(1);
//         cnt--;
//     } 

//     return (void *)100; // 暂时：线程退出的时候的退出码
// }

// class Task
// {
// public:
//     Task(int a, int b) : _a(a), _b(b)
//     {
//     }
//     ~Task() {}
//     int Excute()
//     {
//         return _a + _b;
//     }

// private:
//     int _a;
//     int _b;
// };

// class Result
// {
// public:
//     Result(int result) : _result(result)
//     {
//     }
//     int GetResult() { return _result; }
//     ~Result() {}

// private:
//     int _result;
// };

// //exit不可以终止线程，它是用来终止进程的。
// void *routine(void *args)
// {
//     // pthread_detach(pthread_self());//自己将自己从主线程分离
//     // std::cout<< "新线程被分离" << std::endl;
//     int cnt = 5;
//     while(cnt--)
//     {
//         std::cout<< "new线程 " << std::endl;
//         sleep(1);
//     }

//     return nullptr;
//     // Task *t = static_cast<Task*>(args);
//     // sleep(1);
//     // Result *res = new Result(t->Excute());  
//     // //return res;
//     // pthread_exit(res);//退出线程
//     // std::cout << "haha 新线程不应该看到这里" << std::endl;
// }

// int main()
// {
//     pthread_t tid;
//     //Task *t = new Task(10, 20);
//     pthread_create(&tid, nullptr, routine, (void*)"thread -l");

//     // pthread_detach(tid);
//     // std::cout<< "新线程被分离" << std::endl;

//     int cnt = 5;
//     while (cnt--)
//     {
//         std::cout << "main线程名字: " << std::endl;
//         sleep(1);
//     }

//     int n = pthread_join(tid,nullptr);
//     if(n != 0)
//     {
//         std::cout << "pthread_join error: " << strerror(n) << std::endl;
//     }
//     else
//     {
//         std::cout << "pthread_join success: " << strerror(n) << std::endl;
//     }
//     // sleep(3);
//     // pthread_cancel(tid);
//     // std::cout << "新线程被取消" << std::endl;

//     // void *ret = nullptr;
//     // pthread_join(tid, &ret);
//     // std::cout<< "新线程结束, 运行结果:" << (long long)ret << std::endl;


//     // Result *ret = nullptr;
//     // pthread_join(tid, (void**)&ret);
//     // int n = ret->GetResult();

//     // std::cout << "新线程结束，运行结果: " << n << std::endl;
//     // delete t;
//     // delete ret;
//     return 0;
// }



// #include <thread>

// void hello()
// {
//     while(true)
//     {
//         std::cout << "新线程. hello world ,pid" << getpid() << std::endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     std::thread t(hello);

//     while(true)
//     {
//         std::cout << "我是主线程..." << ",pid: " << getpid() << std::endl;
//         sleep(1);
//     }

//     t.join();
//     return 0;
// }

// void *threadrun(void *args)
// {
//     std::string name = (const char*)args;
//     while(true)
//     {
//         std::cout << "我是新线程: name: " << name << ",pid: " << getpid() << std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,threadrun,(void*)"thread-l");

//     while(true)
//     {
//         std::cout << "我是主线程..." << ",pid: "<< getpid() << std::endl;
//         sleep(1);
//     }
//     return 0;
// }